spb/wp-spboucher-ai
Public
1import type { Metadata } from "next";2import { notFound } from "next/navigation";3import { getLocale } from "@/lib/i18n/server";4import { t } from "@/lib/i18n";5import { getDataset, listPapers } from "@/lib/papers/queries";6import { PaperRow } from "@/components/paper-items";7export const revalidate = 300;8export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }): Promise<Metadata> { const { slug } = await params; const x = await getDataset(slug); const locale = await getLocale(); return x ? { title: locale === "fr" ? x.name_fr : x.name_en, alternates: { canonical: `/datasets/${slug}` } } : {}; }9export default async function DatasetPage({ params }: { params: Promise<{ slug: string }> }) {10 const { slug } = await params; const locale = await getLocale(); const d = t(locale); const x = await getDataset(slug); if (!x) notFound();11 const res = await listPapers({ dataset: [slug], sort: "recent", perPage: 100 });12 const rows: [string, string | null][] = [[d.datasets.provider, x.provider], [d.datasets.coverage, x.coverage], [d.datasets.frequency, x.frequency], [d.datasets.access, x.access_conditions], [d.datasets.license, x.license]];13 return (<div className="container py-10"><p className="kicker">{d.papers.dataset}</p><h1 className="text-3xl sm:text-4xl mt-2">{locale === "fr" ? x.name_fr : x.name_en}</h1>14 <dl className="card p-5 mt-6 grid gap-3 sm:grid-cols-2 text-sm max-w-3xl">{rows.filter(([, v]) => v).map(([k, v]) => <div key={k}><dt className="label">{k}</dt><dd className="text-fg-2">{v}</dd></div>)}{x.url && <div><dt className="label">URL</dt><dd><a href={x.url} rel="noopener" className="text-navy">{x.url}</a></dd></div>}<div><dt className="label">{d.datasets.access}</dt><dd><span className={`chip ${x.is_public ? "" : "chip-burgundy"}`}>{x.is_public ? d.datasets.public : d.datasets.restricted}</span></dd></div></dl>15 {(locale === "fr" ? x.description_fr : x.description_en) && <p className="mt-4 text-fg-2 max-w-3xl">{locale === "fr" ? x.description_fr : x.description_en}</p>}16 <p className="meta mt-6">{res.total} {res.total === 1 ? d.topics.paper : d.topics.papers}</p><div className="card px-5 mt-3">{res.items.map((p) => <PaperRow key={p.id} p={p} locale={locale} />)}</div></div>);17}18